package edu.ucue.ptc.gco.ui;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
import edu.ucue.ptc.gco.mdl.Cliente;
import edu.ucue.ptc.gco.mdl.Direccion;
import edu.ucue.ptc.gco.mdl.Producto;
import edu.ucue.ptc.gco.ngc.ClienteManagerLocal;
import edu.ucue.ptc.gco.ngc.DireccionManagerLocal;
import edu.ucue.ptc.gco.util.AtributoInvalidoException;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.el.ELContext;
import javax.el.ValueExpression;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import org.primefaces.context.RequestContext;

/**
 *
 * @author DELL
 */
@Named(value = "clienteAction")
@SessionScoped
public class ClienteAction implements Serializable {

    @Inject
    private ClienteManagerLocal clienteManager;
    private Cliente cliente;
    private Cliente clientesel;
    @Inject
    private DireccionManagerLocal direccionManager;
    private Direccion direccionSel;
    private Direccion direccionañadir = new Direccion();
    private List<Direccion> direcciones;
    private List<Cliente> listacliente;

    public Direccion getDireccionañadir() {
        return direccionañadir;
    }

    public void setDireccionañadir(Direccion direccionañadir) {
        this.direccionañadir = direccionañadir;
    }

    public boolean isModomodificar() {
        return modomodificar;
    }

    public void setModomodificar(boolean modomodificar) {
        this.modomodificar = modomodificar;
    }
    private boolean modomodificar = false;

    /**
     * Creates a new instance of ClienteAction
     */
    public ClienteAction() {
        cliente = new Cliente();
    }

    public ClienteManagerLocal getClienteManager() {
        return clienteManager;
    }

    public void setClienteManager(ClienteManagerLocal clienteManager) {
        this.clienteManager = clienteManager;
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public DireccionManagerLocal getDireccionManager() {
        return direccionManager;
    }

    public void setDireccionManager(DireccionManagerLocal direccionManager) {
        this.direccionManager = direccionManager;
    }

    public Direccion getDireccionSel() {
        return direccionSel;
    }

    public void setDireccionSel(Direccion direccionSel) {
        this.direccionSel = direccionSel;
    }

    public List<Cliente> getListacliente() {
        return listacliente;
    }

    public void setListacliente(List<Cliente> listacliente) {
        this.listacliente = listacliente;
    }

    public List<Direccion> getDirecciones() {
        return direcciones;
    }

    public void setDirecciones(List<Direccion> direcciones) {
        this.direcciones = direcciones;
    }

    public static ClienteAction getInstance() {
        ELContext context = FacesContext.getCurrentInstance().getELContext();
        ValueExpression ex = FacesContext.getCurrentInstance().getApplication().getExpressionFactory().
                createValueExpression(context, "#{clienteAction}", ClienteAction.class);
        return (ClienteAction) ex.getValue(context);
    }

    public String crearCliente() {
        try {
            if (!modomodificar) {
                Cliente c = clienteManager.crearClienteD(cliente, direcciones, LoginAction.getUsername(), LoginAction.getPassword());
                if (c != null) {
                    addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "AÑADIR CLIENTE", "CLIENTE CREADO CORRECTAMENTE"));
                }
            } else {
                modificarCliente(cliente);
                modomodificar = false;
                RequestContext.getCurrentInstance().update("tablaP");
                return "listaclientes";
            }
        } catch (Exception ex) {
            addMessage(new FacesMessage(FacesMessage.SEVERITY_ERROR, "AÑADIR CLIENTE", "ERROR: " + ex.toString()));
        }
        return "";
    }

    public void addMessage(FacesMessage message) {
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    public void cargaLista() {
        try {
            listacliente = clienteManager.listar(LoginAction.getUsername(), LoginAction.getPassword());
        } catch (Exception ex) {
            addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "LISTAR CLIENTE", "NO EXISTEN REGISTROS"));
        }
    }

    public String eliminar(Cliente clienteMod) {
        try {
            System.out.println(clienteMod.getCedulaRuc());
            System.out.println(clienteMod.getNombres());
            System.out.println(clienteMod.getIdPersona());
            String resp = clienteManager.eliminarEmpleado(clienteMod, LoginAction.getUsername(), LoginAction.getPassword());
            if (resp.compareTo("ok") == 0) {
                addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "ELIMINAR CLIENTE", "CLIENTE ELIMINADO CORRECTAMENTE"));
                listacliente.remove(clienteMod);
            }
        } catch (Exception ex) {
            addMessage(new FacesMessage(FacesMessage.SEVERITY_ERROR, "ELIMINAR CLIENTE", "NO SE PUDO ELIMINAR REGISTRO, ERROR: " + ex.toString()));
        }
        return "Cliente";
    }

    public String modificarCliente(Cliente clienteMod) {
        cliente = clienteMod;
        try {
            Cliente c = clienteManager.modificar(cliente, LoginAction.getUsername(), LoginAction.getPassword());
            if (c != null) {
                addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "MODIFICAR CLIENTE", "CLIENTE MODIFICADO CORRECTAMENTE"));
            }
        } catch (Exception ex) {
            addMessage(new FacesMessage(FacesMessage.SEVERITY_ERROR, "MODIFICAR CLIENTE", "NO SE PUDO MODIFICAR REGISTRO, ERROR: " + ex.toString()));
        }
        return "Cliente";
    }

    public String cancel() {
        modomodificar = false;
        return "index";
    }

    @PostConstruct
    public void init() {
        direcciones = new ArrayList<Direccion>();
        cargaLista();
    }

    public String añadirDireccion() {
        direccionañadir = DireccionAction.getInstance().getDireccion();
        direcciones.add(direccionañadir);
        RequestContext.getCurrentInstance().update(":MyTableDirecciones");
        DireccionAction.getInstance().setDireccion(new Direccion());
        return "Cliente";

    }

    public void añadirNuevaDireccion() {
        DireccionAction.getInstance().setDireccion(new Direccion());
        RequestContext.getCurrentInstance().update(":dialogAnadirDireccion");
    }

    public void mostrardirecciones(Cliente cliente) {
        try {
            direcciones = direccionManager.ListarDireccionPorCliente(cliente.getIdPersona(), LoginAction.getUsername(), LoginAction.getPassword());
            RequestContext.getCurrentInstance().update(":contenido:dialogAnadirCliente");
        } catch (AtributoInvalidoException ex) {
            addMessage(new FacesMessage(FacesMessage.SEVERITY_ERROR, "MOSTRAR CLIENTE", "NO SE PUDO MOSTRAR REGISTRO, ERROR: " + ex.toString()));
        }
    }

    public Cliente getClientesel() {
        return clientesel;
    }

    public void setClientesel(Cliente clientesel) {
        this.clientesel = clientesel;
    }

    public String modificar(Cliente clienteMod) {
        cliente = clienteMod;
        modomodificar = true;
        return "Cliente";
    }
    
    public String eliminarDireccion(Direccion direccion)
    {
        direcciones.remove(direccion);
        RequestContext.getCurrentInstance().update(":MyTableDirecciones");
        return "Cliente";
    }
}
